Пространство имён в php 5.3 и php 6
Пространство имён (namespace/package) знакомо java и c# программистам, теперь доступно и в php. Нужно оно для того, что-бы не писать длинные перефиксы к названиям классов, как сейчас делается в Zend, PEAR и других библиотеках и платформах для совместимости.
Вместо этого классы, функции, интерфейсы (абстрактные классы) и константы могут быть объединены в одно пространство имён. Глобальные переменные в это пространство не входят.
Простой пример
Определяется пространство ключевым словом namespace
//определяем класс в пространстве namespace MyCMS::Core; class System{}
Использование этого класса в третьих библиотеках осуществляется ключевым словом use
require_once('mycms/core.php'); use MyCMS::Core::System; //импортируем только заданный класс $objSystem=new System;
Как вы уже догадались, разделитель :: работает так же как и вызов статических методов, разделяя уровень пространства имён и конкретный класс. Уровень вложённости пространств можно использовать наряду с модульностью библиотеки, например реализовать пространства Database::MySQL::Adapter и Database::Oracle::Adapter.
Новые возможности и новые проблемы
Если в пространстве имён имя класса перезаписывает ранее объявленный глобальный класс или функцию, то к нему по прежнему можно обратится чер ез ::SomeClassName, однако не зная к какой именно реализации программист обращается может вызвать проблемы. Например можно переобъявить стандартные php функции, поменять sin() и cos() местами, что-бы кому-то жизнь мёдом не казалась.
Для отладки существует рабочая константа NAMESPACE.
С двоеточием возникает и проблема неоднозначности:
A::B() // вызов функции B из namespace A A::B() // вызов статичного метода B у класса A
Читайте по теме: